const createError = require('http-errors')
const express = require('express')
const path = require('path')
const cookieParser = require('cookie-parser')
const logger = require('morgan')
const session = require('express-session')
const redisStore = require('connect-redis')(session)
const fs = require('fs')

// var indexRouter = require('./routes/index')
// var usersRouter = require('./routes/users')
const blogRouter = require('./routes/blog')
const userRouter = require('./routes/user')
const redisClient = require('./db/redis')

const app = express()

// view engine setup
// app.set('views', path.join(__dirname, 'views'))
// app.set('view engine', 'jade')

const ENV = process.env.NODE_ENV

if (ENV !== 'production') {
  // 开发环境或者测试环境
  app.use(logger('dev'))
} else {
  // 线上环境

  const logFileName = path.join(__dirname, 'logs', 'access.log')
  const writeStream = fs.createWriteStream(logFileName, {
    flags: 'a'
  })
  app.use(logger('combined', {
    stream: writeStream
  }));
}

app.use(express.json())
app.use(express.urlencoded({ extended: false }))
app.use(cookieParser())
// app.use(express.static(path.join(__dirname, 'public')))

// 存储 session 到 redis
const sessionStore = new redisStore({
  client: redisClient
})

// 解析完 cookie 就解析 session
app.use(session({
  // 类似于一个密匙
  secret: 'Lb@#c_13323',
  // 配置 cookie
  cookie: {
    // path 和 httpOnly 都是默认值，可以不写
    path: '/',
    httpOnly: true,
    // 失效时间，不同于之前在 blog-1 中做的 expires
    // 24小时失效
    maxAge: 24 * 60 * 60 * 1000
  },
  store: sessionStore
}))

// app.use('/', indexRouter)
// app.use('/users', usersRouter)
app.use('/api/blog', blogRouter)
app.use('/api/user', userRouter)

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404))
})

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message
  res.locals.error = req.app.get('env') === 'dev' ? err : {}

  // render the error page
  res.status(err.status || 500)
  res.render('error')
})

module.exports = app
